from django.shortcuts import render
from django.http import HttpResponse, JsonResponse

# Create your views here.
from django.views.generic.base import View

from meiduo_mall.libs.captcha.captcha import captcha
from django_redis import get_redis_connection

from meiduo_mall.libs.yuntongxun.ccp_sms import CCP
from random import randint

from celery_tasks.sms.tasks import send_sms


class ImageView(View):
    """
    获取图片验证码
    """

    def get(self, request, uuid):
        """
        :param request:
        :param uuid: 前端传递的图片编号，后端以这个uuid命名生成的图片，方便后续验证验证码。
        :return:
        """

        # 1. 生成图片验证码
        text, image = captcha.generate_captcha()

        # 2. 保存生成的验证码到redis数据库中（验证码信息不需要长期保存，redis中可以设置有效期)
        # 2-1. 连接数据库，参数就是dev.py配置文件中的那个指定的库名
        conn = get_redis_connection("verify")
        # 2-2. 写入验证码信息到redis数据库中，设置300秒过期
        conn.setex("img_%s" % uuid, 300, text)

        # 3. 返回响应报文
        return HttpResponse(image, content_type="image/jpg")


class SendSMSView(View):
    """
    发送短信验证码
    """

    def get(self, request, mobile):

        # 判断redis中有没有flag标志
        sms_conn = get_redis_connection("sms_code")
        flag = sms_conn.get("flag_%s" % mobile)
        # if flag.decode() == "1":
        if flag:
            return JsonResponse({"code": 400, "errmsg": "请不要频繁发送短信"})

        # 1.接收前端传递的数据 手机号，用户输入的验证码以及图片验证码id
        image_code = request.GET.get("image_code")
        image_code_id = request.GET.get("image_code_id")

        # 2.验证用户输入的验证码和实际生成的是否一致
        # 2-1. 从redis中读取保存的真实的验证码
        conn = get_redis_connection("verify")
        real_code = conn.get("img_%s" % image_code_id)
        real_code_str = real_code.decode()
        # 2-2. 比对用户输入的和真实的验证码
        if image_code.lower() != real_code_str.lower():
            return JsonResponse({"code": "400", "errmsg": "两个验证码不一致"}, status=400)

        # 3.发送短信
        # 3-1. 生产短信验证码，借助random随机生成
        sms_code = randint(0, 999999)

        # 3-2. 将验证码保存到redis中
        sms_conn = get_redis_connection("sms_code")
        # sms_conn.setex("sms_code_%s" % mobile, 300, sms_code)
        # # 3-2.2 写入一个60s有效期的判断数据
        # sms_conn.setex("flag_%s" % mobile, 60, "1")

        # 生成管道对象减少redis连接次数。
        pline = sms_conn.pipeline()
        pline.setex("sms_code_%s" % mobile, 300, sms_code)
        pline.setex("flag_%s" % mobile, 60, "1")
        pline.execute()

        # 3-3. 发送验证码
        # data = CCP().send_template_sms("18025354185", [sms_code, 5], 1)
        # print(data)
        # 为了防止发生阻塞，我们使用异步方式发送
        send_sms.delay(mobile, sms_code)

        # 4. 返回ok
        # return JsonResponse({"code": "200", "errmsg":"OK"})

        return JsonResponse({"code": 0, "errmsg": "发送短信成功"})
